class Observer {
  //接收接入的对象，将对象属性转化为get set
  constructor (data) {
    this.data = data
    // 遍历
    this.walk(data)
  }
  // 封装用于数据遍历的方法
  walk (data) {
    Object.keys(data).forEach(key => this.convert(key, data[key]))
  }
  // 将对象转化为响应式数据的方法
  convert (key, value) {
    defineReactive(this.data, key, value)
  }
}

// 用于为对象定义响应式属性
function defineReactive (data, key, value) {
  // 创建消息中心
  const dep = new Dep()

  observer(value)
  Object.defineProperty(data, key, {
    enumerable: true,
    configurable: true,
    get () {
      console.log("获取属性")
      // 触发get时添加订阅者
      Dep.target && dep.addSub(Dep.target)
      return value
    },
    set (newValue) {
      console.log("设置属性")
      if (newValue  === value) {
        return 
      }
      value = newValue
      observer(value)

      // 数据变化时，通知消息中心
      dep.notify()
    }
  })
}

function observer (value) {
  // 检测是否是对象,如果是，创建一个新的Observer实例进行管理
  if (typeof value === 'object' && value !== null ){
    return new Observer(value)
  }
}